package com.liufei.class07;

import com.liufei.common.TreeNode;

// https://leetcode.cn/problems/path-sum/description/
public class Code03_PathSum {

    public static boolean isSum = false;

    public static boolean hasPathSum(TreeNode root, int targetSum) {
        if (root == null) {
            return false;
        }
        // 因为是static全局变量，所以每次都要重置
        isSum = false;
        process(root, 0, targetSum);
        return isSum;
    }

    public static void process(TreeNode root, int preSum, int targetSum) {
        // 如果当前节点是空，那么他的上一个节点不一定是叶子节点，所以这里不能使用 root == null 作为范围条件
        if (root.left == null && root.right == null) {
            // 1. 是叶子节点
            if (root.val + preSum == targetSum) {
                isSum = true;
            }
            return;
        }
        // 2. 非叶子节点，继续往下走
        preSum += root.val;
        // 注意这里需要做空判断，不然上面判断叶子节点逻辑会报空指针
        if (root.left != null) {
            process(root.left, preSum, targetSum);
        }
        if (root.right != null) {
            process(root.right, preSum, targetSum);
        }
    }
}
